package jheej5024;

//import J21_PublicClass;
//import siejheej5024J21_PublicClass;

public class J21_AccessModifier {

	//캡슐화encapsulation와 접근제어
    //OOP의 원칙에서 캡슐화는 객체의 일부를 "보호"하고
	//노출해도 상관없는 부분을 노출했을 때에는
	//"안전"해야 한다는 매커니즘

	//예를 들어, 텔레비젼은 캡슐화의 좋은 예임
	//텔레비젼의 수많은 부품들은 금속커버 안에 놓아둠
	//클래스 개발자는 변수와 메서드들을 외부로 부터 감춰두어야 함
	
	//자바는 접근 제어를 통해 캡슐화를 지원함
	//접근제어의 종류에는 4가지가 존재
	//private : 자신만 접근 가능, 그외는 접근 불가
	//protected :상속관계의 클래스만 접근 가능
	//public : 어디서나 접근가능함을 의미
	//default : 기본 패키지 내 클래스들끼리만 접근가능
	
	//클래스에 적용 : public, default 만 사용가능
	//멤버변수에 적용 : public, protected, private, default
	//메서드에 적용 :public, protected, private, default
	
	
	//결론
	//OOP의 캡슐화 원칙에 따라 클래스의 멤버변수들은 무조건 private 선언
	//클래스의 메서드들은 외부에 노출하려면 public으로 선언하고, 그외의 경우에는 protected로 선언
	
	
	public static void main(String[] args) {
		// default 클래스 불러오기 (실패!)
	    //default 패키지에 선언된 클래스는
		//같은 패키지내에 존재하는 클래스만이 접근가능
		//즉, siestageek 패키지에서 default 패키지에 있는 클래스로 접근이 안됨
		//J21_DefaultClass dfc = new J21_DefaultClass();
			
		//J21_PublicClass 클래스가 public 이라 하더라도
		//default 패키지내에 있으므로 접근 불가
	    //J21_PublicClass dfc = new J21_DefaultClass();
		//J21_PublicClass 클래스는 public 이기 때문에
		
			
		//어떤 패키지라도 접근 가능
			
		    
		 J21_PublicClass pbc1 = new J21_PublicClass();
		 exercise.J21_PublicClass pbc2 = new exercise.J21_PublicClass();
		    		
		 //클래스의 멤버변수에 접근
		 //같은 패키지내 멤버변수 접근 pbc1
		  pbc1.defaultval = 1;
		  pbc1.publicval = 2;
		 // pbc1.privateval = 3;
		 pbc1.publicMethod();
		   
		  
		  //다른 패키지내 클래스의 멤버변수 접근 pbc2
		  //pbc2.defaultval = 4;
          pbc2.publicval = 5;
          //pbc2.privateval = 6;
		  pbc2.publicMethod();
          
          
          
	}

}
